package response

import "strings"

//Response response
type Response struct {
	// root 数据
	Data interface{}
}

func (r *Response) Delete(pattern string) *Response {
	if pattern == ""{
		return r
	}
	root:=_Node{
		data:r.Data,
	}

	root.Pattern(pattern, func(node *_Node)bool {
		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			index:= node.index
			sl:= parent.data.([]interface{})

			nl:=sl[:index]
			sl=append(nl,sl[index+1])
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
		}
		return false
	})
	return r
}
//SetValue 设置目标值，如果目标不存在，会对路径进行创建
func (r *Response) SetValue(pattern string,value interface{}) {
	if pattern == ""{
		r.Data = value
		return
	}
	root:=_Node{
		data:r.Data,
	}
	root.Make(strings.Split(pattern,"."))

	root.Pattern(pattern, func(node *_Node)bool {

		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			sl:= parent.data.([]interface{})
			index:= node.index
			sl[index] = value
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			mp[node.key]=value
		}
		return false
	})

}

//ReTarget 选择目标重新设置为root
func (r *Response) ReTarget(pattern string) {
	if pattern == ""{
		return
	}
	root:=_Node{
		data:r.Data,
	}

	match, _ := root.Pattern(pattern, func(node *_Node) bool {
		r.Data = node.data

		return true
	})
	if !match{
		r.Data = make(map[string]interface{})
	}
	return
}
//Group
func (r *Response) Group(path []string) {
	l:=len(path)
	if l==0{
		return
	}
	root := make(map[string]interface{})
	node:=root

	lastKey := path[l-1]
	if l>1{
		for _,key:=range path[:l-1]{
			v := make(map[string]interface{})
			node[key]=v
			node = v
		}
	}

	node[lastKey] = r.Data
	r.Data = root
}
//ReName 重命名
func (r *Response)ReName(pattern string,newName string)  {
	if pattern == ""{
		return
	}
	root:=_Node{
		data:r.Data,
	}

	root.Pattern(pattern, func(node *_Node) bool {
		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			return false

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
			mp[newName]=node.data
			return false
		}
		return false
	})
}

func (r *Response)Move(source ,target string)  {

	if strings.Index(source,"*") != -1{
		return
	}
	if strings.Index(target,"*") != -1{
		return
	}
	root:=_Node{
		data:r.Data,
	}
	var oldValues *_Node
	match,_:=root.Pattern(source, func(node *_Node) bool {
		oldValues = node

		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			index:= node.index
			sl:= parent.data.([]interface{})

			nl:=sl[:index]
			sl=append(nl,sl[index+1])
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
		}
		return false
	})
	if match{
	 	r.SetValue(target,oldValues.data)
	}else{
		r.SetValue(target,nil)
	}

}